// pages/songDetail/songDetail.js
import Pubsub from 'pubsub-js';
import moment from 'moment';
import request from '../../utils/request';
// 获取全局实例
const appInstance = getApp();

Page({

  /**
   * 页面的初始数据
   */
  data: {
    isPlay: false, // 音乐是否播放
    song: {}, // 歌曲对象
    musicId: '', // 音乐id
    musicLink: '', // 音乐链接
    currentTime: '00:00',  // 实时时间
    durationTime: '00:00', // 总时长
    currentWidth: 0, // 实时进度条的宽度
    playOrder: 0, // 播放顺序：0-顺序 1-随机 2-单曲
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    let musicId = options.musicId;
    this.setData({
      musicId: musicId,
      playOrder: appInstance.globalData.musicPlayOrder // 初始化播放顺序
    });
    this.getSongDetail(musicId);

    // 判断音乐状态是否为播放
    if(appInstance.globalData.isMusicPlay && appInstance.globalData.musicId === musicId){
      // 修改当前播放状态为true
      this.setData({
        isPlay: true
      })
    }
    // 创建音乐播放实例
    this.backgroundAudioManager = wx.getBackgroundAudioManager();
    // 监视音乐播放/暂停/停止
    this.backgroundAudioManager.onPlay(() => {
      this.changeMusicState(true);
      // 修改全局音乐播放状态
      appInstance.globalData.musicId = musicId;
    });
    this.backgroundAudioManager.onPause(() => {
      this.changeMusicState(false);
    });
    this.backgroundAudioManager.onStop(() => {
      this.changeMusicState(false);
    });
    // 监听音乐播放自然结束
    this.backgroundAudioManager.onEnded(() => {
      if (this.data.playOrder == 2) {
        // 单曲循环【有音乐链接，不需要请求】
        this.musicControl(true, this.data.musicId, this.data.musicLink)
      } else {
        // 自动切换至下一首音乐，并且自动播放
        Pubsub.publish('switchType', 'next');
        // 进度条切换为初始位置，实时时间也还原为0000
        this.setData({
          currentWidth: 0,
          currentTime: '00:00'
        });
      }
      
    });

    // 监听音乐播放进度
    this.backgroundAudioManager.onTimeUpdate(() => {
      let currentTime = moment(this.backgroundAudioManager.currentTime * 1000).format('mm:ss');
      let currentWidth = this.backgroundAudioManager.currentTime/this.backgroundAudioManager.duration * 450;
      this.setData({
        currentTime,
        currentWidth
      });
    })
    // 进入歌曲详情自动播放
    this.handleMusicPlay();
  },

  // 修改音乐播放属性
  changeMusicState(isPlay){
    this.setData({
      isPlay
    })
    // 修改全局音乐播放状态
    appInstance.globalData.isMusicPlay = isPlay;
  },

  // 播放顺序的改变
  changePlayOrder() {
    let { playOrder } = this.data;
    if(playOrder == 0){ 
      playOrder = 1
    } else if(playOrder == 1) {
      playOrder = 2
    } else {
      playOrder = 0
    }

    appInstance.globalData.musicPlayOrder = playOrder;
    this.setData({ 
      playOrder
    });
  },

  // 获取歌曲详情
  async getSongDetail(musicId){
    let songData = await request('/song/detail', {ids: musicId});
    // 获取歌曲时长
    let durationTime = moment(songData.songs[0].dt).format('mm:ss');
    this.setData({
      song: songData.songs[0],
      durationTime
    });
    // // 修改标题
    // wx.setNavigationBarTitle({
    //   title: this.data.song.name,
    // })
  },

  // 控制音乐播放/暂停的回调
  handleMusicPlay(){
    let isPlay = !this.data.isPlay;
    this.changeMusicState(isPlay);
    let {musicId, musicLink} = this.data
    this.musicControl(isPlay, musicId, musicLink);
  },

  // 控制音乐播放、暂停的功能函数
  async musicControl(isPlay, musicId, musicLink){
    if(isPlay){
      if(!musicLink){
        // 获取音乐链接
        let musicLinkData = await request('/song/url', {id: musicId});
        musicLink = musicLinkData.data[0].url;
        this.setData({
          musicLink
        })
      }
      // 播放音乐
      this.backgroundAudioManager.src = musicLink;
      this.backgroundAudioManager.title = this.data.song.name;
    } else {
      // 音乐暂停
      this.backgroundAudioManager.pause();
    }
  },

  // 控制切歌回调
  handleSwitch(event){
    // 获取切歌类型
    let type = event.currentTarget.id;
    // 关闭当前播放音乐
    this.backgroundAudioManager.stop();
    // 订阅recommendSong页面的musicId消息
    Pubsub.subscribe('musicId', (msg, musicId) => {
      // 获取音乐详情|播放音乐
      this.getSongDetail(musicId);
      this.musicControl(true, musicId);
      // 取消订阅
      Pubsub.unsubscribe('musicId');
    })
    // 发布消息数据给recommendSong
    Pubsub.publish('switchType', type);
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})